Sitemap fácil com Django
Sitemap fácil com Django
Confesso que demorei um pouco para fazer meu sitemap.xml funcionar na primeira vez, ao utilizar o Django. Mas ele é bastante simples, e vou tentar explicar em como fazê-lo funcionar com alguns poucos passos.
Para isso, vamos fazer um sitemap para um blog, em que temos páginas estáticas e posts do blog.
Observação: Para fazê-lo funcionar, iremos editar apenas o arquivo urls.py. Adicione as informações após o que você já possui no urls.py (com exceção do from … import …)
Classes de sitemap
Para começar, vamos utilizar duas classes de sitemap. Uma delas será para buscar os posts (BlogSiteMap), e outra será para as páginas estáticas (ViewSitemap).
from django.contrib.sitemaps import Sitemap
# ... (códigos que você já tem o urly.py)
class BlogSitemap(Sitemap):
priority = 0.5
def items(self):
return Post.objects.all() # Não esquecer de importar Post
def lastmod(self, obj):
return obj.pub_date
class ViewSitemap(Sitemap):
priority = 0.5
def items(self):
return ['home', 'about_us', 'contact', 'page1', 'page2']
def location(self, item):
return reverse(item)
Em ambas em defini uma prioridade default de 0.5 (mude como achar melhor), mas as outras informações ele descobre com cada objeto.
BlogSitemap
Em items, ele retornará todos os objetos da minha lista de posts. Para obter a última modificação, apenas informei que essa informação está no atributo pub_date do objeto post. E para descobrir a localização (a url), minha classe tem uma função chamada get_absolute_url, que é utilizado para descobrir.
Se não conhece o get_absolute_url, basta criar uma função no seu model com esse nome, e retornar a página (não precisa de protocolo nem domínio, pois isso é responsabilidade de outras classes. No caso, Site, que normalmente vem implementada). Se quiser saber mais, veja na documentação oficial.
ViewSitemap
Em items, eu mesmo defini as páginas. Como são strings, não possuem o método get_absolute_url, e então defini na mão como obter sua localização. Esse método reverse é ótimo para que ele mesmo busque de minhas urls, pois caso eu resolva mudar a url, não preciso ficar caçando no código onde alterar.
Inserindo na urls.py
E mais o código abaixo, está quase pronto.
sitemaps = {
'blog': BlogSitemap,
'book': BookSitemap,
'views': ViewSitemap,
}
urlpatterns += patterns('',
(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
)
O que você fez, foi cadastrar essas informações de sitemaps para que o próprio gerador do Django cuide do resto.
Configurações
Últimos detalhes para funcionar.
É preciso editar o seu settings.py, adicionando ‘django.contrib.sitemaps’ aos seus INSTALLED_APPS.
E também cadastrar no seu BD (normalmente utilizando o admin) com o seu próprio site. Normalmente ele vem como localhost (como na imagem abaixo):
Este é um jeito fácil de implementar o sitemaps.xml.
Mas há outras configurações, e você pode vê-las no site oficial: https://docs.djangoproject.com/en/1.8/ref/contrib/sitemaps/.